﻿// 方格取数 DP.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using  namespace std;

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1277

设有N×N的方格图，我们在其中的某些方格中填入正整数，而其它的方格中则放入数字0。
某人从图中的左上角A出发，可以向下行走，也可以向右行走，直到到达右下角的B点。
在走过的路上，他可以取走方格中的数（取走后的方格中将变为数字0）。

此人从A点到B点共走了两次，试找出两条这样的路径，使得取得的数字和为最大。

【输入】
第一行为一个整数N（N≤10），表示N×N的方格图。
0
接下来的每行有三个整数，第一个为行号数，第二个为列号数，第三个为在该行、该列上所放的数。一行“0 0 0”表示结束。

【输出】
第一个整数，表示两条路径上取得的最大的和。

【输入样例】
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
【输出样例】
67
*/

const int N = 20;
int dp[N][N][N][N];
int gra[N][N];
int n;

void solve() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            for (int x = 1; x <= n; x++) {
                for (int y = 1; y <= n; y++) {
                    if (x + y != i + j) continue;
                    int t = gra [i][j];
                    if (i != x || y != j) {
                        t += gra[x][y];
                    }
                    int& curr = dp[i][j][x][y];
                    curr = max(curr, dp[i][j - 1][x][y - 1]);
                    curr = max(curr, dp[i-1][j][x][y - 1]);
                    curr = max(curr, dp[i][j - 1][x-1][y]);
                    curr = max(curr, dp[i-1][j][x-1][y]);
                    curr += t;
                }
            }
        }
    }

    cout << dp[n][n][n][n] << endl;
}

int main()
{
    cin >> n;
    int x, y, w;
    while (cin >> x >> y>>w) {
        if (x == 0 && y == 0&&  w==0) break;
        gra[x][y] = w;
    }

    solve();

    return 0;
}


/*

#include <iostream>

using  namespace std;

const int N = 15;
int n;
int w[N][N];
int f[N * 2][N][N];

int main()
{
    cin >> n;

    int a, b, c;
    while (cin >> a >> b >> c, a || b || c) w[a][b] = c;

    for (int k = 2; k <= n + n; k++) {
        for (int i1 = 1; i1 <= n; i1++) {
            for (int i2 = 1; i2 <= n; i2++) {
                int j1 = k - i1; int j2 = k - i2;
                if (j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n) {
                    int t = w[i1][j1];
                    if (i1 != i2) t += w[i2][j2];
                    int& x = f[k][i1][i2];
                    x = max(x, f[k-1][i1 - 1][i2 - 1] + t);
                    x = max(x, f[k-1][i1-1][i2]+t);
                    x = max(x, f[k-1][i1][i2 - 1] + t);
                    x = max(x, f[k-1][i1][i2]+t);
                }

            }
        }
    }

    cout << f[n + n][n][n] << endl;

    return 0;
}


*/
 